package org.easy.http.client.util.digest;

import org.easy.http.client.ex.FatalDigestException;

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

/**
 * @Description TODO
 * @Author WuXueLi
 * @Date 17:39 2023/2/4
 * @Version 1.0
 **/
public class Md5 {

    /**
     * md5计算
     *
     * @param data 待计算的数据
     * @return md5计算结果
     */
    public static byte[] digest(final byte[] data) {
        return DigestUtils.getMd5Digest().digest(data);
    }

    /**
     * 将输入流的数据进行MD5计算
     *
     * @param data 待计算的数据
     * @return md5计算结果
     */
    public static byte[] digest(final InputStream data) {
        try {
            return DigestUtils.digest(DigestUtils.getMd5Digest(), data);
        } catch (IOException e) {
            throw new FatalDigestException(e);
        }
    }

    /**
     * 计算字符串的md5值，结果转为16进制的字符串返回,默认采用{@link StandardCharsets#UTF_8}编码
     *
     * @param data 待计算的数据
     * @return 16进制的字符串
     */
    public static String digestHex(final String data) {
        return digestHex(data, StandardCharsets.UTF_8);
    }

    /**
     * 计算字符串的md5值，结果转为16进制的字符串返回
     *
     * @param data    待计算的数据
     * @param charset 指定编码，为空时采用UTF8读取
     * @return 16进制的字符串
     */
    public static String digestHex(final String data, final Charset charset) {
        byte[] salt = data.getBytes(charset == null ? StandardCharsets.UTF_8 : charset);
        byte[] md5Data = digest(salt);
        return Hex.encode2String(md5Data);
    }

    /**
     * 计算的流的md5值，结果转为16进制的字符串返回
     *
     * @param data 待计算的数据
     * @return 16进制的字符串
     */
    public static String digestHex(final InputStream data) {
        return Hex.encode2String(digest(data));
    }

    /**
     * 计算字符串(默认UTF8)的MD5值，将结果转为BASE64输出
     *
     * @param data 待计算的数据
     * @return BASE64的字符串
     */
    public static String digestBase64(final String data) {
        return digestBase64(data, StandardCharsets.UTF_8);
    }

    /**
     * 计算字符串的MD5值，将结果转为BASE64输出
     *
     * @param data    待计算的数据
     * @param charset 字符串编码
     * @return BASE64的字符串
     */
    public static String digestBase64(final String data, final Charset charset) {
        byte[] salt = data.getBytes(charset == null ? StandardCharsets.UTF_8 : charset);
        byte[] md5Data = digest(salt);
        return Base64.encode(md5Data);
    }

}
